/*
*
* This file is part of Luces de 1984 SDL version (L1-sdl).
* Copyright (C) <2017>  <alkeon> [alkeon@autistici.org]
   
* L1-sdl is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L1-sdl is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l1-sdl.  If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include "metodos.h"
#include "personajes.h"
#include "SDL.h"
#include "SDL_ttf.h"
using namespace std;

#define VERSION "1.1-sdl"

void juego::guardar(std::string guardar,Personaje& v){
	if(this->guardados_automaticos==1 ){
		printa("Narrador:Guardando partida...\n");	
		string line;
		std::ofstream out("save.dat");
		out << "Nombre: " << v.nombre << "\nVida: " << to_string(v.vida) << "\nAtaque: " << to_string(v.ataque) << "\nBotiquín: " << to_string(v.botiquin) << "\nBalas: " << to_string(v.balas) << "\nDaño " << to_string(v.balas_dano) << "\nGanzúa: " << to_string(v.ganzua) << "\nGuardado: " << guardar << "\nGuardados automáticos: " << to_string(this->guardados_automaticos) << "\nVersión: " << VERSION << "\nPsicosis: " << to_string(v.psicosis) << "\nSoledad: " << to_string(v.soledad) << "\nEsperpento: " << to_string(v.esperpento) << "\nHola Dave: " << to_string(v.hola_dave) << "\nBug: " << to_string(v.bug) << "\nPistola: " << to_string(v.pistola);
		
		printa("Narrador:Partida guardada.\n");
	}
}
void juego::cargarcompleto(string partida,Personaje& v,Personaje& h){
	string line;
	ifstream in(partida.c_str());
	while(getline(in,line)){

		size_t aux=line.find("Nombre: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			v.nombre=line;
		}
		aux=line.find("Vida: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> v.vida;
		}
		aux=line.find("Ataque: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.ataque;
		}
		aux=line.find("Botiquín: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> v.botiquin;
		}
		aux=line.find("Balas: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+7);
			stringstream(line) >> v.balas;
		}
		aux=line.find("Daño: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> v.balas_dano;
		}
		aux=line.find("Ganzúa: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.ganzua;
		}
		aux=line.find("Guardado: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			v.funcion_guardada=line;
		}
		aux=line.find("Guardados automáticos: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+23);
			stringstream(line) >> this->guardados_automaticos;
		}
		aux=line.find("Psicosis: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> v.psicosis;
		}
		aux=line.find("Pistola: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+9);
			stringstream(line) >> v.pistola;
		}
		aux=line.find("Soledad: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.soledad;
		}
		aux=line.find("Esperpento: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+12);
			stringstream(line) >> v.esperpento;
		}
		aux=line.find("Hola Dave: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+11);
			stringstream(line) >> v.hola_dave;
		}
		aux=line.find("Bug: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+5);
			stringstream(line) >> v.bug;
		}
	}
	this->cargarnivel(v,h);
}
void juego::cargarnivel(Personaje& v, Personaje& h){
	if(v.funcion_guardada[0]=='a'){
		if(v.funcion_guardada[1]=='2'){
			this->interrogatorio(v,h);
		}
		if(v.funcion_guardada[1]=='3'){
			this->huida(v,h);
		}
		if(v.funcion_guardada[1]=='4'){
			this->provisiones(v,h);
		}
		if(v.funcion_guardada[1]=='6'){
			this->flashback(v,h);
		}
		if(v.funcion_guardada[1]=='7'){
			this->informacion(v,h);
		}
		if(v.funcion_guardada[1]=='9'){
			this->usas_un_ordenador(v,h);
		}
	}else{
		if(v.funcion_guardada[0]=='1'){
			this->preguntas_principales(v,h);
		}
		if(v.funcion_guardada=="-1"){
			v.vida=200;
			v.ataque=20;
			h.vida=80;
			h.ataque=4;
			this->preguntas_principales(v,h);
		}
		if(v.funcion_guardada[1]=='2'){
			this->huida_ruidosa(v,h);
		}
		if(v.funcion_guardada[1]=='3'){
			this->vuelves(v,h);
		}
		if(v.funcion_guardada[1]=='4'){
			this->ayudantes_cerradura(v,h);
		}
		if(v.funcion_guardada[1]=='5'){
			this->muerte_al_francotirador(v,h);
		}
		if(v.funcion_guardada[0]!='1' && v.funcion_guardada[0]!='b'){
			if(v.funcion_guardada[0]=='2'&& v.funcion_guardada[1]=='0'){
				this->non_plus_ultra(v,h);
			}else{			
				this->preguntas_principales(v,h);
			}
		}
	}
}

void juego::vista_previa_partida(string partida_carga){
	string line;
	string nombrel;
	bool partida;
	int vida;
	string version;
	ifstream in(partida_carga.c_str());
	int final1=1;
	int final2=1;
	int final3=1;
	int final4=1;
	int final5=1;
	for(int i=0;i<17 && getline(in,line); ++i){	
		size_t aux=line.find("Nombre: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			nombrel=line;
		}
		aux=line.find("Vida: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> vida;
		}
		aux=line.find("Versión: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+9);
			version=line;
			partida=true;
		}
		aux=line.find("Psicosis: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> final1;
		}
		aux=line.find("Soledad: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> final2;
		}
		aux=line.find("Esperpento: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+12);
			stringstream(line) >> final3;
		}
		aux=line.find("Hola Dave: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+11);
			stringstream(line) >> final4;
		}
		aux=line.find("Bug: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+5);
			stringstream(line) >> final5;
		}
	}
	std::string final1_str;
	std::string final2_str;
	std::string final3_str;
	std::string final4_str;
	std::string final5_str;
	if(final1==0)
		final1_str="Conseguido";
	if(final1==1)
		final1_str="No conseguido";
	if(final2==0)
		final2_str="Conseguido";
	if(final2==1)
		final2_str="No conseguido";
	if(final3==0)
		final3_str="Conseguido";
	if(final3==1)
		final3_str="No conseguido";
	if(final4==0)
		final4_str="Conseguido";
	if(final4==1)
		final4_str="No conseguido";
	if(final5==0)
		final5_str="Conseguido";
	if(final5==1)
		final5_str="No conseguido";
	if(partida){
			std::string line;
			std::stringstream numeros;
			numeros.str( "" );
			numeros << "Vida \t\t\t " << vida << "\n"; 
			this->printa("Partida encontrada\n");
			line="Nombre \t\t\t "+nombrel+"\n";
			this->printa(line);
			
			this->printa(numeros.str());
			line="Final 1 \t\t "+final1_str+"\n";
			this->printa(line);
			line="Final 2 \t\t "+final2_str+"\n";
			this->printa(line);
			line="Final 3 \t\t "+final3_str+"\n";
			this->printa(line);
			line="Final 4 \t\t "+final4_str+"\n";
			this->printa(line);
			line="Final 5 \t\t "+final5_str+"\n";
			this->printa(line);
			if(final1==0 && final2==0 && final3==0 && final4==0 && final5==0){
				this->printa("Esta partida ha sido completada con todos los finales. Enhorabuena al jugador y espero que haya disfrutado (dentro de las limitaciones) del juego. \nAtte:Alkeon\n");
			}
			if(version!=VERSION)
				this->printa("La partida guardada está desactualizada y puede provocar fallos inesperados\n");
			this->printa("¿Quieres cargar esta partida?\n" );
			this->printa("1.- Sí \n2.- No\n");
			SDL_Event e;
			bool continua=true;
			while(continua){
			if( SDL_WaitEvent( &e ) != 0 ){
				if( e.type == SDL_KEYDOWN ){
					if(e.key.keysym.sym == SDLK_1){
						Personaje v(0,20,0,0,0);
						v.nombre=nombrel;
						Personaje h(0,30,0,0,1);
						this->cargarcompleto("save.dat",v,h);
						continua=false;
					}else{
						juego juego_actual;
						Personaje molde(0,30,0,0,1);
						Personaje Winston(0,20,0,0,0);
						this->menu(Winston,molde);
					}
				}
				if(e.type == SDL_QUIT){
					continua=false;
				}
			}
		}
	}
}
